package lib

import (
	"bufio"
	"bytes"
	"encoding/base64"
	"image/jpeg"
	"image/png"
	"io/ioutil"
	"log"
	"os"
)

//base64ToPngimage base64转为png图片
func base64ToPngimage(imagebase64 string) error {
	debytes, err := base64.StdEncoding.DecodeString(imagebase64)
	if err != nil {
		return err
	}
	bt := bytes.NewReader(debytes)

	image, err := png.Decode(bt)
	if err != nil {
		log.Println("png 编辑出错")
		return err
	}
	f, err := os.OpenFile("./file/"+GetUniqueFileName()+".png", os.O_WRONLY|os.O_CREATE, 0777) //等待拆分
	if err != nil {
		return err
	}
	// f.Write(debytes)
	defer f.Close()
	png.Encode(f, image) //Options是编码参数，它的取值范围是1-100，值越高质量越好
	return nil
}

//base64ToJpgimage base64转为jpeg图片
func base64ToJpgimage(imagebase64 string) error {
	debytes, err := base64.StdEncoding.DecodeString(imagebase64) //这里需要注意，data:image/jpeg;base64的前缀需要先去掉
	if err != nil {
		return err
	}
	bt := bytes.NewReader(debytes)

	image, err := jpeg.Decode(bt)
	if err != nil {
		log.Println("jpeg 编辑出错")
		return err
	}
	f, err := os.OpenFile("./file/"+GetUniqueFileName()+".jpeg", os.O_WRONLY|os.O_CREATE, 0777) //等待拆分
	if err != nil {
		return err
	}
	// f.Write(debytes)//不需要其他精度的话，直接这一句完成图片加载即可
	// defer f.Close()
	jpeg.Encode(f, image, &jpeg.Options{Quality: 100}) //Options是编码参数，它的取值范围是1-100，值越高质量越好
	return nil
}

//imageToBase64 传入图片路径，转化为base64返回
func imageToBase64(url string) (string, error) {
	imgFile, err := os.Open(url) // a QR code image
	if err != nil {
		return "", err
	}
	defer imgFile.Close()
	fInfo, _ := imgFile.Stat() //返回文件结构
	size := fInfo.Size()       //获取文件大小
	buf := make([]byte, size)  //根据大小分配一个byte数组
	fReader := bufio.NewReader(imgFile)
	fReader.Read(buf)
	imgBase64Str := base64.StdEncoding.EncodeToString(buf)
	// imgBase64Str := base64.RawStdEncoding.EncodeToString(buf)
	// if err := dataTofile("data:image/jpeg;base64," + imgBase64Str); err != nil { //默认是不产生头标志的，需要自己添加
	//这里不加前缀，是为了将base64转回来方便，生成的时候没有，解析回图片的时候也不需要
	if err := dataTofile(imgBase64Str); err != nil {
		return "", err
	}
	return imgBase64Str, nil
}

//getBase64Data 获取txt中记录的base64数据
func getBase64Data() (string, error) {
	f, err := ioutil.ReadFile("./file/a.txt")
	if err != nil {
		return "", err
	}
	// f.Read()
	return string(f), nil
}

//dataTofile 将数据写入记录文档中
func dataTofile(data string) error {
	f, err := os.Create("./assets/" + GetUniqueFileName() + ".txt")
	if err != nil {
		return err
	}
	defer f.Close()
	f.Write([]byte(data))
	return nil
}

//Base64Load 图片转化base64格式，输入图片路径，反馈base64和err
//D:/file/1574832892(1).jpg
func Base64Load(url string) (string, error) {
	base64, err := imageToBase64(url)
	if err != nil {
		return "", err
	}
	return base64, err
}

//Base64imageLoad base64生成图片测试
func Base64imageLoad() error {
	str, err := getBase64Data()
	if err != nil {
		return err
	}
	if err := base64ToJpgimage(str); err != nil {
		return err
	}
	return nil
}
